/*
 * util.h
 *
 * Các hàm tiện ích
 *
 *  Created on: Nov 28, 2010
 *      Author: cumeo89
 */

#ifndef UTIL_H_
#define UTIL_H_

#include <glib.h>

#ifndef PATH_MAX
#define PATH_MAX 4096 /* không tìm được hằng này nên dùng tạm */
#endif


/**
 * Tìm độ dài của một chuỗi UCS-4 kết thúc bởi kí tự 0 hoặc kí tự
 * từ 0x80000000 trở lên.
 * @return độ dài xâu kí tự
 */
glong g_unichar_strlen(gunichar *s);

/**
 * Duyệt qua từng phần tử trong danh sách liên kết đơn.
 */
#define g_slist_foreach(iter, list) GSList *iter; \
		for (iter = (list); iter != NULL; iter = iter->next)

/**
 * Chứa xâu kí tự được dùng trong khi dựng cây
 */
typedef struct {

	/**
	 * Xâu kí tự mã hoá UCS4, kết thúc bằng một kí tự không có
	 * trong bảng chữ cái nhưng không nhất thiết là kí tự \0
	 */
	gunichar *s;

	/**
	 * Độ dài của xâu kí tự, tính cả kí tự kết thúc
	 */
	glong m;

} Ucs4String;

/**
 * Chuyến tất cả các xâu kí tự mã hoá bằng UTF-8 trong mảng
 * strings (mảng kết thúc bằng con trỏ NULL) thành kiểu
 * Ucs4String.
 */
Ucs4String **utf8ToUcs4All(const gchar **strings);

/**
 * Tìm độ dài của một mảng con trỏ kết thúc bằng con trỏ NULL
 * @return độ dài mảng
 */
int pointerArrSize(void *parr);

/**
 * <p>Trích ra một xâu con từ xâu mã hoá bằng UTF-8. Lưu ý rằng UTF-8
 * là dạng mã hoá độ dài thay đổi nên không thể dùng các hàm tách
 * xâu thông thường.</p>
 *
 * <p>Nếu xâu con chứa cả kí tự 0 của xâu ban đầu ở cuối, thay thế kí
 * tự này bằng '$' để dễ hiển thị.</p>
 *
 * @return xâu con, cần được giải phóng bằng hàm free
 */
gchar *utf8_substring(const gchar* str, glong startOffset, glong endOffset);

#endif /* UTIL_H_ */
